# 1.时间复杂度
# 2.空间复杂度


def func_1(n):  # O(1)
    print("Hello World")


def func_2(n):  # O(n)
    for i in range(n):
        print("Hello World")


def func_3(n):  # O(n2)
    for i in range(n):
        for j in range(n):
            print("Hello World")


def func_4(n):  # O(n3)
    for i in range(n):
        for j in range(n):
            for k in range(n):
                print("Hello World")


# 1.眨眼：几毫秒
# 2.计算 29 + 68：几秒
# 3.烧一壶水：几分钟
# 4.睡觉：几个小时
# 5.完成一个软件项目：几天 几周 几个月
# 6.飞船飞出银河系：几年 几十年

# 代码的执行效率有一个统一的量级的概念


def func_5(n):  # O(1)
    print("Hello World")
    print("Hello Python")
    print("Hello Algorithm")


def func_6(n): # O(n2)
    for i in range(n):
        print("Hello World")
        for j in range(n):
            print("Hello World")


def func_7(n):  # O(n)
    while n > 1:
        print(n)
        n -= 1


def func_8(n):  # O(log n) 当我们进行计算的时候，每执行一次，循环就会折半，复杂度就是 log n
    while n > 1:
        print(n)
        n = n // 2


# 2的6次方 = 64
# log2 64 = 6

# 2的循环次数次方 = n
# log2 n = 循环次数


# O(1) < O(log n) < O(n) < O(nlog n) < O(n2) < O(n2log n) < O(n3) < ...
# O(n!)、O(2n)、O(nn)

# 如何快速去判断算法的时间复杂度
# 1. n是什么，一般来说是循环的次数
# 2. 是否有循环减半的过程，没有出现 就是n，有则视为 log n
# 3. 是否有循环嵌套的情况，如 k层，nk

# 空间复杂度一般用户评估算法执行过程中占用内存的大小

# 1.整体过程中使用了几个变量：O(1)
# 2.如果使用了长度为 n 的一维列表：O(n)
# 3.如果使用了 m 行 n 列的二维列表：O(m * n)

# 很多时候我们可以用空间换时间，并行计算、分布式计算


if __name__ == "__main__":
    func_8(32)
